package com.JingYan.HuaWei;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @program: JingYan
 * @ClassName: JKC002.java
 * @author: Dong
 * @version: 1.0.0
 * @Description: 华为机考C
 * @createTime 2024年04月14日 13:03:00
 */
public class JKC002 {
    // 答案并不完整

    /**
     * 实现一个简易的重复内容识别系统，通过给定的两个内容名称，和相似内容符号，判断两个内容是否相似；如果相似，返回相似的内容；如果不相似，返回不相似的内容
     * 初始化：给出两个字符串，一些相似字符对，如顿号和逗号相似，的和de相似，猪和潴，给出两个字符串的相似判断结果
     *  输入：两条语句，给出是否相似，对于相似的语句，返回True和相似的字符对；对于不相似的内容，则返回第一个内容的不相似信息，方便后续补充
     *  注意：
     *  1、相似关系是 具有 传递性的。例如，如果 "顿号" 和 "逗号" 是相似的，"逗号" 和 "分号" 是相似的，则 "顿号" 和 "逗号" 是相似的。
     *  2、为了过滤一些无意义的信息，这里***可以匹配任意长度的内容，
     *  例如：给出相似对 "(***)",""时，'异世邪君（人气玄幻作家）'和'异世邪君' 认为是相似，此时相似符号返回 *** 即可
     *  3、不相似的内容，需要给出不相似的字符串，多处不相似的字符串用空格分隔
     */
    private Map<String, String> similarPairs;

    public JKC002(Map<String, String> similarCharacterPairs) {
        this.similarPairs = similarCharacterPairs;
    }

    public Pair<Boolean, String> compareStrings(String contentA, String contentB) {
        Deque<String> dissimilarSubstrings = new ArrayDeque<>();

        // 替换两个字符串中的相似字符
        String processedA = processContent(contentA);
        String processedB = processContent(contentB);

        // 比较处理后的字符串
        if (processedA.equals(processedB)) {
            // 查找并返回实际使用的相似字符对
            return new Pair<>(true, findUsedSimilarPairs(contentA, contentB));
        } else {
            // 收集不相似子串
            findDissimilarSubstrings(contentA, contentB, dissimilarSubstrings);

            // 返回False和连接的不相似子串
            return new Pair<>(false, String.join(" ", dissimilarSubstrings));
        }
    }

    private String processContent(String content) {
        for (Map.Entry<String, String> entry : similarPairs.entrySet()) {
            String original = entry.getKey();
            String similar = entry.getValue();
            Pattern pattern = Pattern.compile(Pattern.quote(original));
            content = pattern.matcher(content).replaceAll(similar);
        }
        return content;
    }

    private void findDissimilarSubstrings(String contentA, String contentB, Deque<String> dissimilarSubstrings) {
        int i = 0, j = 0;
        while (i < contentA.length() && j < contentB.length()) {
            if (contentA.charAt(i) != contentB.charAt(j)) {
                int start = Math.min(i, j);
                int end = Math.max(i, j);

                while (start < end && contentA.charAt(start) == contentB.charAt(start)) {
                    start++;
                }

                while (end - 1 > start && contentA.charAt(end - 1) == contentB.charAt(end - 1)) {
                    end--;
                }

                dissimilarSubstrings.add(contentA.substring(start, end));
                i = end;
                j = end;
            } else {
                i++;
                j++;
            }
        }
    }

    private String findUsedSimilarPairs(String contentA, String contentB) {
        // 此部分由于需要跟踪所有可能使用的相似对而较为复杂。
        // 为简化起见，假设提供的相似对列表已经足够全面。
        // 实际上，可能需要更高级的方法来准确识别所使用的特定相似对。

        // 示例：返回一个占位符字符串，如“使用的相似对：(参见输入相似对)”。
        return "使用的相似对：(参见输入相似对)";
    }
    // 辅助类，由于Java没有内置Pair类
    class Pair<L, R> {
        public final L left;
        public final R right;

        public Pair(L left, R right) {
            this.left = left;
            this.right = right;
        }
    }



    public static void main(String[] args) {
        Map<String, String> similarityRules = new HashMap<>();
        similarityRules.put("、", ",");
        similarityRules.put("的", "de");
        similarityRules.put("猪", "潴");
        similarityRules.put("异世邪君(***)", "异世邪君"); // 处理***
        similarityRules.put("你***好", "你好"); // 处理***

        JKC002 detector = new JKC002(similarityRules);

        String content1 = "异世邪君（人气玄幻作家）";
        String content2 = "异世邪君";
        System.out.println(detector.compareStrings(content1, content2));

        content1 = "今天天气真好";
        content2 = "今天天气不错";
        System.out.println(detector.compareStrings(content1, content2));
        content1 = "今天天气真的好";
        content2 = "今天天气真de好";
        System.out.println(detector.compareStrings(content1, content2));

        content1 = "你真TM好";
        content2 = "今天天气真de好";
        System.out.println(detector.compareStrings(content1, content2));
    }
}
